/*
 * Nome do arquivo: usuarioDAO.java
 * Autores:	Bruno Villas Bôas           - 317527
 *              Diego Zamboni               - 344990
 *              Endel Guimarães             - 379930
 * 		Guilherme Torres            - 400572
 *		Renan Oliveira              - 380113
 * 
 * Turma: 2012/1
 *
 * Descricao: DAO responsável pela armazenamento físico de usuario
 *
 * Data de conclusao: 
 */
package cooper.classes.dao;

import com.sun.jmx.remote.internal.ArrayQueue;
import cooper.classes.bean.UsuarioBean;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class UsuarioDAO {

    private Connection conn;
    private int total;

    public UsuarioDAO() throws CooperDAOException {
        try {
            this.conn = ConnectionCooperFactory.getConnection();
        } catch (Exception e) {
            throw new CooperDAOException("Erro: " + ":\n" + e.getMessage());
        }
    }

    // Cadastra uma usuario no BD
    public void cadastrar(UsuarioBean usuario) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (usuario == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {

            String nome = usuario.getNome();
            String sobrenome = usuario.getSobrenome();
            int telefone = usuario.getTelefone();
            String skype = usuario.getSkype();
            String email = usuario.getEmail();
            String user = usuario.getUsuario();
            String senha = usuario.getSenha();
            int tipoUsuario = usuario.getTipousuario();

            // Insere a usuario na base de dados
            String SQL = "INSERT INTO usuarios (nome,sobrenome,telefone,skype,email,usuario,senha,tipousuario) VALUES ('" + nome + "','" + sobrenome + "', '" + telefone + "','" + skype + "','" + email + "','" + user + "','" + senha + "','" + tipoUsuario + "')";
            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();

        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao inserir dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do cadastrar

    // Altera uma usuario no BD
    public void alterar(UsuarioBean usuario) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (usuario == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {
            int id = usuario.getId();
            String nome = usuario.getNome();
            String sobrenome = usuario.getSobrenome();
            int telefone = usuario.getTelefone();
            String skype = usuario.getSkype();
            String email = usuario.getEmail();
            String user = usuario.getUsuario();
            String senha = usuario.getSenha();
            int tipoUsuario = usuario.getTipousuario();

            // Altera a usuario na base de dados
            String SQL = "UPDATE usuarios SET nome='" + nome + "', sobrenome='" + sobrenome + "', telefone='" + telefone + "', skype='" + skype + "', email='" + email + "', usuario='" + user + "', senha='" + senha + "', tipousuario='" + tipoUsuario + "' WHERE idusuarios=" + id;

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao alterar dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do alterar

    // Remove uma usuario no BD
    public void remover(UsuarioBean usuario) throws CooperDAOException {
        PreparedStatement ps = null;
        Connection conn = null;

        if (usuario == null) {
            throw new CooperDAOException("O valor passado não pode ser nulo");
        }

        try {
            int id = usuario.getId();

            String SQL;

            // Remove a usuario na base de dados
            SQL = "DELETE FROM usuarios WHERE idusuarios=" + id;

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            ps.executeUpdate();
        } catch (SQLException sqle) {
            throw new CooperDAOException("Erro ao remover dados " + sqle);
        } finally {
            ConnectionCooperFactory.closeConnection(conn, ps);
        }
    } // Fim do remover

    // Consulta usuarios por nome
    public ArrayList<UsuarioBean> consultar(String nomePesquisa) throws CooperDAOException {
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {

            ps = this.conn.prepareStatement("Select count(1) as num from usuarios where nome like '%" + nomePesquisa + "%'");
            rs = ps.executeQuery();
            rs.next();
            this.total = (Integer) rs.getObject("num");

            // Talvez tenha que fazer a paginação, esse é o protótipo por enquanto           
            // Essa String tem que ser olhada com cuidado
            String SQL = "SELECT * FROM usuarios WHERE nome LIKE '%" + nomePesquisa + "%' ORDER BY nome ASC";

            conn = this.conn;
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            ArrayList novo = new ArrayList();

            while (rs.next()) {


                int id = (Integer) rs.getObject("idusuarios");
                String nome = rs.getObject("nome").toString();
                String sobrenome = rs.getObject("sobrenome").toString();
                int telefone = (Integer) rs.getObject("telefone");
                String skype = rs.getObject("skype").toString();
                String email = rs.getObject("email").toString();
                String user = rs.getObject("usuario").toString();
                String senha = rs.getObject("senha").toString();
                int tipoUsuario = (Integer) rs.getObject("tipousuario");


                // Não busca os telefones ainda
                // ArrayQueue<Integer> telefones = usuario.getTelefones(); 

                novo.add(new UsuarioBean(id, nome, sobrenome, telefone, skype, email, user, senha, tipoUsuario));
            }
            return novo;
        } catch (SQLException sqle) {
            throw new CooperDAOException(sqle);
        } finally {
            // Tem que alterar isso aqui, claramente
            ConnectionCooperFactory.closeConnection(conn, ps, rs);
        }
    } // Fim do consultar

    public int getTotal() throws CooperDAOException {
        return this.total;
    }
}
